package com.sws.weixin.token;

import com.sws.common.utils.spring.SpringUtils;
import com.sws.weixin.util.HttpUtil;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 微信Token工具类
 */
@Component("weixinTokenUtil")
public class TokenUtil {
    
    private static final Logger log = LoggerFactory.getLogger(TokenUtil.class);
    
    @Value("${wx.appid}")
    private String appId;
    
    @Value("${wx.secret}")
    private String appSecret;
    
    private static AccessToken accessToken = new AccessToken();

    /**
     * 获取Token - 使用稳定版接口
     */
    public void getToken() {
        // 使用稳定版接口
        String url = "https://api.weixin.qq.com/cgi-bin/stable_token";
        
        // 构建POST请求参数
        String jsonParams = String.format("{\"grant_type\":\"client_credential\",\"appid\":\"%s\",\"secret\":\"%s\"}", 
                appId, appSecret);
        
        log.debug("请求微信token接口: {}", url);
        String result = HttpUtil.doPost(url, jsonParams);
        log.debug("微信token接口返回: {}", result);
        
        try {
            JSONObject jsonObject = JSONObject.fromObject(result);
            
            // 检查是否有错误码
            if (jsonObject.containsKey("errcode") && jsonObject.getInt("errcode") != 0) {
                int errcode = jsonObject.getInt("errcode");
                String errmsg = jsonObject.getString("errmsg");
                log.error("获取微信access_token失败: errcode={}, errmsg={}", errcode, errmsg);
                
                // 处理特定错误码
                if (errcode == 45009) {
                    log.error("调用次数超过限制");
                } else if (errcode == 40013) {
                    log.error("不合法的 AppID");
                } else if (errcode == 40125) {
                    log.error("不合法的secret");
                }
                return;
            }
            
            // 获取token和过期时间
            String token = jsonObject.getString("access_token");
            long expiresIn = jsonObject.getLong("expires_in");
            accessToken.setToken(token);
            accessToken.setExpireTime(expiresIn);
            log.info("成功获取微信access_token，有效期{}秒", expiresIn);
        } catch (Exception e) {
            log.error("解析微信token响应异常", e);
        }
    }

    /**
     * 获取AccessToken
     * @return AccessToken字符串
     */
    public String getAccessToken() {
        if(accessToken == null || accessToken.isExpired()) {
            getToken();
        }
        return accessToken.getToken();
    }
    
    /**
     * 强制刷新AccessToken
     * @return 刷新后的AccessToken字符串
     */
    public String forceRefreshToken() {
        getToken();
        return accessToken.getToken();
    }
    
    /**
     * 静态方法获取AccessToken，供其他非Spring管理的类使用
     * @return AccessToken字符串
     */
    public static String getStaticAccessToken() {
        TokenUtil tokenUtil = SpringUtils.getBean(TokenUtil.class);
        return tokenUtil.getAccessToken();
    }
    
    /**
     * 静态方法强制刷新AccessToken，供其他非Spring管理的类使用
     * @return 刷新后的AccessToken字符串
     */
    public static String forceRefreshStaticToken() {
        TokenUtil tokenUtil = SpringUtils.getBean(TokenUtil.class);
        return tokenUtil.forceRefreshToken();
    }
}
